#include "../common.h"
#include <typeinfo>
class Any
{
public:
    Any& swap(Any& other)
    {
        // 只交换Any里面的_content,this指针的指向不变
        std::swap(_content, other._content);
        return *this;
    }

    template<class T>
    T* Get()// 希望返回的是一个地址
    {
        assert(_content->type() == typeid(T));
        return &(((placeholder<T>*)_content)->_val);
    }

    class holder
    {
    public:
        virtual ~holder(){}
        virtual std::type_info& type();
        virtual holder* clone();
    };

    template<class T>
    class placeholder:public holder
    {
    public:
        placeholder(const T& val):_val(val){}
        // 返回数据类型
        virtual std::type_info& type()
        { return typeid(T);}
        // 克隆new出一个新的val
        virtual holder* clone()
        { return new placeholder<T>(_val);}
    public:
        T _val;
    };
    holder* _content; // 父类的指针,用于实现多态
public:
    Any()
    :_content(nullptr){}

    template<class T>
    Any(const T& val)
    :_content(new placeholder<T>(val)){}

    // 对other进行判断,存在就克隆给本对象的_content,不存在就置空
    Any(const Any& other)
    :_content(other._content ? other._content->clone() : nullptr){}

    ~Any(){ delete _content;}

    

    template<class T>
    Any& operator=(const T& val)
    { Any(val).swap(*this); return *this;}
    
    Any& operator=(const Any& other)
    { Any(other).swap(*this); return *this;}
};